《高性能網(wǎng)站建設(shè)指南》閱讀筆記_規(guī)則8- 使用外部javascript和css
發(fā)布時(shí)間:2013-11-22 瀏覽:332打印字號(hào):大中小
純粹而言,內(nèi)聯(lián)CSS和JS要快一些。這主要是因?yàn)橥獠康氖纠枰袚?dān)多個(gè)http請(qǐng)求帶來(lái)的開(kāi)銷(xiāo)。盡管外部示例可以從樣式表和腳本的并行下載中獲益,但是明顯第一個(gè)因素影響的更大一些。這也就是它放在第一位的原因。但外部CSS和JS文件有機(jī)會(huì)被瀏覽器緩存起來(lái)。當(dāng)一個(gè)頁(yè)面被重復(fù)訪問(wèn)時(shí),就不需要重復(fù)下載外部CSS和JS了。既減小了需要下載文檔的大小,又不會(huì)產(chǎn)生多余的http請(qǐng)求數(shù)量。
所以,使用內(nèi)嵌式的還是外聯(lián)式的,需要通過(guò)一定的手段衡量。
1、 頁(yè)面查看。每個(gè)用戶產(chǎn)生的頁(yè)面查看越少,內(nèi)聯(lián)的越占優(yōu)勢(shì)。(比如,一個(gè)月只訪問(wèn)你的網(wǎng)站一次,即使有緩存,下次訪問(wèn)的時(shí)候也很有可能被移除了)相反,訪問(wèn)頁(yè)面的次數(shù)越多,外聯(lián)的越有優(yōu)勢(shì)。
2、 緩存,如果沒(méi)有設(shè)置緩存,肯定的是內(nèi)聯(lián)的有優(yōu)勢(shì)
3、 組建重用,簡(jiǎn)單的說(shuō)就是組件重用度低采用內(nèi)聯(lián)的好,高則外聯(lián)的好。這一條是建立在用戶屬否在一次回話中訪問(wèn)網(wǎng)站的多個(gè)頁(yè)面。只有訪問(wèn)多個(gè)頁(yè)面才有意義。有兩種極端情況:一個(gè)是每個(gè)頁(yè)面使用都使用各自單獨(dú)的組件,沒(méi)有公用部分。這樣做會(huì)產(chǎn)生過(guò)多的http請(qǐng)求數(shù)量,只對(duì)用戶只訪問(wèn)一個(gè)頁(yè)面時(shí)有意義。另一種極端是創(chuàng)建一個(gè)單獨(dú)的js文件,包含所有的頁(yè)面使用的js,再創(chuàng)建一個(gè)css包含所有頁(yè)面使用的css。用戶在訪問(wèn)一個(gè)頁(yè)面以后所有的js和css都將會(huì)被緩存。在訪問(wèn)多個(gè)頁(yè)面并且訪問(wèn)非常頻繁的時(shí)候有意義。
事實(shí)上頁(yè)面之間的js和css不可能100%不重合,也不可能100%重合。所以要使用中間情形。對(duì)于我們的網(wǎng)站,訪問(wèn)量比較大,如果訪問(wèn)了一般情況下就不會(huì)只訪問(wèn)一個(gè)頁(yè)面。所以我們使用外聯(lián)的。既有公用的common.js,header.js還有每個(gè)頁(yè)面特有的js。符合這一點(diǎn)。我們的網(wǎng)站使用這種外聯(lián)的最為合適。
那么是不是所有的頁(yè)面都適合使用外聯(lián)的最好?有一個(gè)例外,就是主頁(yè)。
這里的主頁(yè)是指作為瀏覽器默認(rèn)頁(yè)的URL,比如http://hao.#/360導(dǎo)航頁(yè)。
分析:1、頁(yè)面查看,雖然訪問(wèn)量非常高,但是通常每個(gè)回話只訪問(wèn)一個(gè)頁(yè)面。
2、緩存。完整緩存的比例要比其他的網(wǎng)站更低,處于安全原因,很多用戶選擇每次關(guān)閉瀏覽器的時(shí)候自動(dòng)清空緩存,所以下一次訪問(wèn)的時(shí)候依舊是空緩存狀態(tài)。
3、組件重用,一般情況下都是跳轉(zhuǎn)到其他的網(wǎng)站去,所以無(wú)所謂組件重用。
兩全其美:
本書(shū)中還介紹了兩種技術(shù),使頁(yè)面既可以獲得內(nèi)聯(lián)的優(yōu)勢(shì),同時(shí)又能緩存外部文件。
加載后下載
上面提到的360導(dǎo)航適合使用內(nèi)聯(lián),但是并不是說(shuō)有的主頁(yè)都是只訪問(wèn)一個(gè)頁(yè)面,比如我們淘車(chē)的網(wǎng)站。我們既希望使用內(nèi)聯(lián)快速的加載出頁(yè)面,又希望通過(guò)緩存外部組件的形式為后面其他頁(yè)面的瀏覽做準(zhǔn)備。所以就會(huì)用到下載后加載的技術(shù)。
示例:
加載后下載是將doOnload函數(shù)內(nèi)聯(lián)到文檔的onload事件。在1秒的延遲之后(確保頁(yè)面呈現(xiàn)完畢),就會(huì)下載所需要的js和css文件,通過(guò)創(chuàng)建對(duì)應(yīng)的DOM元素(script和link)并賦予制定的URL實(shí)現(xiàn)。在這種頁(yè)面中。Js和css會(huì)被加載到頁(yè)面中兩次(先是內(nèi)聯(lián)的,然后是外部的)要使其能夠工作,必須處理雙重定義。例如腳本可以定義但不能執(zhí)行任何函數(shù)(至少不能讓用戶發(fā)覺(jué))。使用了相對(duì)單位(百分比)的css也會(huì)產(chǎn)生問(wèn)題。解決辦法:將這些組件放在一個(gè)不可見(jiàn)的Ifeame中。
動(dòng)態(tài)內(nèi)聯(lián):
配合加載后下載使用,下載組件后設(shè)置cookie。然后重新加載頁(yè)面后判斷有沒(méi)有cookie,有的話使用外部的,沒(méi)有的話使用內(nèi)聯(lián)的。這樣就能在內(nèi)聯(lián)和外部之間做出只能選擇,從而改善響應(yīng)時(shí)間。


